package ar.com.ctrln.view.dashboard.calendar;

import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventQueue;
import org.zkoss.zk.ui.event.EventQueues;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zk.ui.util.Clients;
import org.zkoss.zul.Button;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Label;
import org.zkoss.zul.Textbox;
import org.zkoss.zul.Window;

import ar.com.ctrln.control.administracion.cliente.RegistrarCliente;
import ar.com.ctrln.control.calendar.RegistrarTemaEvento;
import ar.com.ctrln.control.compras.RegistrarPedidoCompra;
import ar.com.ctrln.control.mantenimiento.factibilidad.ConsultarFactibilidadCliente;
import ar.com.ctrln.control.mantenimiento.ticket.RegistrarActividad;
import ar.com.ctrln.control.mantenimiento.ticket.RegistrarTicket;
import ar.com.ctrln.control.ventas.servicio.RegistrarContratacionServicio;
import ar.com.ctrln.persistence.model.cliente.Cliente;
import ar.com.ctrln.persistence.model.compra.PedidoCompra;
import ar.com.ctrln.persistence.model.contratacion.ContratacionServicio;
import ar.com.ctrln.persistence.model.contratacion.DetalleContratacion;
import ar.com.ctrln.persistence.model.contratacion.DetalleContratacionInternet;
import ar.com.ctrln.persistence.model.contratacion.DetalleContratacionTelefonia;
import ar.com.ctrln.persistence.model.evento.TemaEvento;
import ar.com.ctrln.persistence.model.factibilidad.DetalleFactibilidad;
import ar.com.ctrln.persistence.model.factibilidad.Factibilidad;
import ar.com.ctrln.persistence.model.factibilidad.FactibilidadCliente;
import ar.com.ctrln.persistence.model.factibilidad.Requerimiento;
import ar.com.ctrln.persistence.model.factibilidad.TemaFactibilidad;
import ar.com.ctrln.persistence.model.servicios.Servicio;
import ar.com.ctrln.persistence.model.servicios.internet.ServicioInternet;
import ar.com.ctrln.persistence.model.servicios.telefonia.Operador;
import ar.com.ctrln.persistence.model.servicios.telefonia.ServicioTelefonia;
import ar.com.ctrln.persistence.model.ticket.Ticket;
import ar.com.ctrln.persistence.model.ticket.TipoTicket;
import ar.com.ctrln.persistence.model.ticket.actividad.Actividad;
import ar.com.ctrln.persistence.model.ticket.actividad.DetalleActividad;
import ar.com.ctrln.view.ui.comportamientoVentana.AbstractMinimizarVentana;

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class DetalleTemaEventoController extends AbstractMinimizarVentana {

	private static final long serialVersionUID = -1969042413567120126L;

	@WireVariable
	private RegistrarTemaEvento registrarTemaEvento;

	@WireVariable
	private RegistrarTicket registrarTicket;

	@WireVariable
	private RegistrarActividad registrarActividad;

	@WireVariable
	private RegistrarCliente registrarCliente;

	@WireVariable
	private RegistrarContratacionServicio registrarContratacion;

	@WireVariable
	private ConsultarFactibilidadCliente consultarFactibilidadCliente;

	@WireVariable
	private RegistrarPedidoCompra registrarPedidoCompra;

	@Wire
	private Window wTemaEvento;

	@Wire
	private Label lbEstado;

	@Wire
	private Label lbNombre;

	@Wire
	private Textbox tbDescripcion;

	@Wire
	private Label dbFechaAlta;

	@Wire
	private Label dbFechaEvento;

	@Wire
	private Textbox tbResultado;

	@Wire
	private Combobox cboxEstado;

	@Wire
	private Button bActualizarEvento;

	private TemaEvento tema;

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		tema = (TemaEvento) this.getSelf().getParent().getAttribute("tema");

		if (tema == null) {
			// error
			wTemaEvento.onClose();
			return;
		}

		lbEstado.setValue(tema.getEstado());
		lbNombre.setValue(tema.getNombre());
		tbDescripcion.setText(tema.getObservacion());
		dbFechaAlta.setValue(tema.getFechaCompletaInicioString());
		if (tema.getEvento() != null) {
			dbFechaEvento.setValue(tema.getEvento().getFechaInicioString());
		} else {
			Clients.showNotification("Tema sin asignar a un Evento",
					dbFechaEvento);
		}
	}

	@Listen("onClick = #bActualizarEvento")
	public void actualizarTema() {
		Date referencia = new Date();
		if (cboxEstado.getSelectedItem().getLabel().equals(TemaEvento.APROBADO)) {
			if (tema instanceof TemaFactibilidad) {
				Cliente c = registrarCliente.getCliente();
				TemaFactibilidad temaFactibilidad = registrarTemaEvento
						.buscarId(tema.getId());
				FactibilidadCliente f = (FactibilidadCliente) temaFactibilidad
						.getFactibilidad();
				c.setRazonSocial(f.getRazonSocial());
				c.setCuit_cuil(f.getCuit_cuil());
				c.setTipoActividad(f.getTipoActividad());
				c.setTipoOrganizacion(f.getTipoOrganizacion());
				c.setTelefonos(f.getTelefonos());
				c.setSitioWeb(f.getSitioWeb());
				c.setEmail(f.getSitioWeb());
				c.setDireccion(f.getDireccion());
				c.setTipoIva(f.getTipoIva());
				c.setFechaAlta(new Date());

				f.setActiva(false);
				f.setEstado(Factibilidad.ACEPTADA);
				f.setFechaResolucion(new Date());
				f.setResolucion(tbResultado.getText());

				registrarCliente.nuevoCliente(c);

				consultarFactibilidadCliente.actualizar(f);
				f.setDetalles(consultarFactibilidadCliente.listarDetalles(f
						.getId()));

				for (DetalleFactibilidad detalle : f.getDetalles()) {
					Ticket t = new Ticket();
					TipoTicket tipoTicket = registrarTicket
							.buscar("Instalacion");

					t.setFechaAlta(new Date());
					t.setEstado(Ticket.ESTADO_PENDIENTE);
					t.setOrganizacion(c);
					long limite = new Date().getTime()
							+ (4 * 24 * 60 * 60 * 1000);
					Date fechaLimite = new Date(limite);
					t.setFechaLimite(fechaLimite);
					t.setTipoTicket(tipoTicket);
					t.setPrioridad("Muy Alta");
					t.setTipoServicio(detalle.getTipoServicio());
					t.setDescripcion("Instalacion "
							+ detalle.getTipoServicio().getNombre());

					registrarTicket.guardarTicket(t);

					Actividad a = new Actividad();
					a.setEstado(Actividad.ESTADO_CREADA);

					a.setFechaInicio(new Date(referencia.getTime()
							+ (4 * 24 * 60 * 60 * 1000)));
					a.setFechaFin(new Date(referencia.getTime()
							+ (7 * 24 * 60 * 60 * 1000)));
					a.setHoraInicio("09:00");
					a.setHoraFin("18:00");
					a.setNombre("Instalacion "
							+ detalle.getTipoServicio().getNombre());
					a.setTicket(t);

					StringBuilder s = new StringBuilder(
							"Para la Instalacion de: ");
					s.append(detalle.getTipoServicio().getNombre());
					s.append(" se requiere: \n");

					Set<DetalleActividad> detalles = new HashSet<DetalleActividad>();
					PedidoCompra pedido = null;
					for (Requerimiento r : detalle.getRequerimientos()) {
						s.append("\n " + r.getInsumos().getNombre());
						DetalleActividad d = new DetalleActividad();
						d.setCantidad(r.getCantidad());
						d.setInsumo(r.getInsumos());
						if (d.getCantidad() > d.getInsumo().getStock()) {
							int delta = d.getCantidad()
									- d.getInsumo().getStock();
							pedido = new PedidoCompra();
							pedido.setFechaAlta(new Date());
							pedido.setInsumo(d.getInsumo());
							pedido.setEstado(PedidoCompra.ESTADO_PENDIENTE);
							pedido.setCantidad(delta);
							pedido.setFechaPref(a.getFechaInicio());
							registrarPedidoCompra.guardarPedido(pedido);
						}
						a.setDescripcion(s.toString());
						d.setActividad(a);
						detalles.add(d);

					}

					a.setDetalles(detalles);

					registrarActividad.guardarActividad(a);

					List<Servicio> servicios = registrarContratacion
							.listaServicios(detalle.getTipoServicio().getId());
					ContratacionServicio contrato = new ContratacionServicio();
					contrato.setCliente(c);

					contrato.setFechaInicio(new Date());
					contrato.setTipoServicio(detalle.getTipoServicio());

					Set<DetalleContratacion> detalleContratacion = new HashSet<DetalleContratacion>();
					Set<Operador> operadores = new HashSet<Operador>();

					contrato.setDetalles(detalleContratacion);
					contrato.setEstado(ContratacionServicio.ESTADO_ACTIVO);

					registrarContratacion.nuevaContratacion(contrato);

					for (Servicio servicio : servicios) {

						if (servicio instanceof ServicioInternet) {
							DetalleContratacionInternet internet = new DetalleContratacionInternet();
							internet.setServicio(servicio);
							internet.setCantidadUsuarios(0);
							internet.setAnchoBandaBajada(0);
							internet.setAnchoBandaSubida(0);
							internet.setCantidadBloquesIp(0);
							internet.setProtocoloRouting("RIP v2");
							internet.setContrato(contrato);
							internet.setFechaInicio(new Date());
							detalleContratacion.add(internet);

							registrarContratacion
									.guardarDetalleInternet(internet);

						} else if (servicio instanceof ServicioTelefonia) {
							DetalleContratacionTelefonia telefonia = new DetalleContratacionTelefonia();
							telefonia.setClave(0);
							telefonia.setContrato(contrato);
							telefonia.setFechaInicio(new Date());
							telefonia.setNroTramas(0);
							telefonia.setOperadores(operadores);
							telefonia.setServicio(servicio);
							detalleContratacion.add(telefonia);
							registrarContratacion
									.guardarDetalleTelefonia(telefonia);
						}
					}

				}
			}
		}

		EventQueue<Event> eq = EventQueues.lookup("actualizarTemas",
				EventQueues.DESKTOP, false);

		eq.publish(new Event("onButtonClick", bActualizarEvento, null));

		tema.setResultado(tbResultado.getText());
		tema.setEstado(cboxEstado.getSelectedItem().getLabel());

		registrarTemaEvento.actualizar(tema);

		Clients.showNotification("Actualizacion de Tema " + tema.getNombre()
				+ " exitosa", Clients.NOTIFICATION_TYPE_INFO, null,
				"middle_center", 4000);

		wTemaEvento.onClose();

	}
}
